class Presupuesto < ActiveRecord::Base
  has_many :presupuesto_detalles, :order => 'created_at'
  has_many :cargos, :class_name => 'PresupuestoDetalle', :conditions => 'operacion = #{PresupuestoDetalle::CARGO}'
  has_many :abonos, :class_name => 'PresupuestoDetalle', :conditions => 'operacion = #{PresupuestoDetalle::ABONO}'
  has_many :orden_salida_presupuestos
  belongs_to :ejecutivo
  
  MATERIALES = 1
  PRODUCTO = 2
  IMAGEN = 3
  
  DESCRIPCION = {
    1 => 'Materiales e Imagen', 2 => 'Producto', 3 => 'Agencia'
  }
  
  validates_presence_of :saldo_inicial, :marca_id, :rubro_id
  validates_numericality_of :saldo_inicial
  #validates_uniqueness_of :rubro_id, :scope => [:marca_id, :ejecutivo_id]
  
  def disponible
    ccargos = cargos.sum('importe').to_f
    cabonos = abonos.sum('importe').to_f
    
    logger.debug "Cargos: #{ccargos}"
    logger.debug "Abonos: #{cabonos}"
    
    saldo_inicial + cabonos - ccargos 
  end
    
  def autorizar(importe)
    logger.debug "#{disponible} vs. #{importe}"
    disponible >= importe
  end
  
  def self.transferir(origen, destino, importe)
    # crear dos partidas de detalle
    # 1) aplicar un movimiento de cargo al presupuesto origen
    cargo = PresupuestoDetalle.new
    cargo.importe = importe
    cargo.operacion = PresupuestoDetalle::CARGO
    origen.presupuesto_detalles << cargo    
    
    # 2) aplicar un movimiento de abono al presupuesto destino
    abono = PresupuestoDetalle.new
    abono.importe = importe
    abono.operacion = PresupuestoDetalle::ABONO
    destino.presupuesto_detalles << abono
    
    Presupuesto.transaction do
      origen.save
      destino.save
    end
    
  end
  
  def self.reservar(origen, destino, importe)
    # 1) aplicar un movimiento de cargo al presupuesto origen
    cargo = PresupuestoDetalle.new
    cargo.importe = importe
    cargo.operacion = PresupuestoDetalle::CARGO
    origen.presupuesto_detalles << cargo    

    # 2) reservar importe
    reservacion = PresupuestoReserva.new(:origen_id => origen.id,
      :destino_id => destino.id, :importe => importe,
      :ejecutivo_id => destino.ejecutivo_id)

    Presupuesto.transaction do
      reservacion.save
      origen.save      
    end
  end
end
